//
//  main.m
//  02-ClassAndObject
//
//  Created by mafeng on 16/7/5.
//  Copyright © 2016年 mafeng. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    // 1. 快捷键
    // command + 0 开/收左边栏
    // command + option + 0 开/收右边栏
    // command + shift + Y 开/收下边栏
    // command + B 编译
    // command + Z 撤销
    // command + shift + z 重做/反撤销
    // command + R 运行
    // command + c 复制
    // command + V 粘贴
    
    
    // 2. 移动光标
    // command + ⬅️ 移动到当前行的最前面
    // command + →  移动到当前行的最右边
    // command + ⬆️ 移动到所有行的第一行的起始位置
    // command + ⬇️ 移动到所有行的最后一行的起始位置
    
    // 3. 选中文字
    // shift + ⬅️ 选中向左一个字
    // shift + → 选中向右的一个字
    // shift + ⬆️ 从当前光标位置开始,选中向上的一行
    // shift + ⬇️ 从当前光标位置开始, 选中向下一行, 对应位置
    
    // command + shift + ⬅️ 选中从光标开始, 左边所有的文字
    // command + shift + →  选中从光标开始, 右边所有的文字
    // command + shift + ⬆️ 选中从光标开始, 上边所有的文字
    // command + shift + ⬇️ 选中从光标开始, 下面所有的文字
    
    // 4. 创建类
    // command + n 新建一个文件
    // command + shift + n 新建一个工程
    
    // 类和对象
    // 类: 一个具有相同特征和行为的事物抽象集合
    // 对象: 类的实例
    // 面向对象的思想, 万物皆对象.
    // 面向对象语言是面向对象思想的具体体现
    // OOP 面向对象编程
    // OOD 面向对象设计
    // 面对对象三大特征: 封装, 继承, 多态 三个的作用:::>提高代码的复用
    
    
    // Objective-C(OC)  错误实例: Object-C Object-c
    // 与C语言的区别是
    // OC属于C语言的扩展
    // OC中声明属性和方法在.h文件中
    // OC中在具体实现在.m文件中
    // .mm C++的文件, 在这个文件里可以编写C++代码
    
    // OC中的根类是NSObject
    
    // 3.创建OC的实例
    // 1>消息语法 [object doSomething];
    // 向objec对象发送一个dosomething的方法, 让他去调用
    // 类方法的调用(由类名去调用其+方法)
    // +alloc 开辟内存空间
    NSObject *objc = [NSObject alloc];
    // 实例方法的调用()
    // -init
    NSObject *newObjc = [objc init];
    
    //创建一个Person对象
    Person *per = [[Person alloc] init];
    // 公开的成员可以直接通过 ->赋值 ->取值
    per->_age = 10;
    NSLog(@"%ld", per->_age);
    // 受保护的成员不能通过->去访问
    
    // id 与 instancetype
    // instancetype 在作为参数返回值的时候与id是一样的, 系统编译器会把id类型转化为instancetype(即当前对象类型)
    // id 可以作为变量去使用, 但instancetype不可以.
    id object = [[NSObject alloc] init];
    // @synthesize 实现声明的属性的get set方法
    // 再用property声明实例变量之后,如果同时重写setter 和 getter方法,实例变量失效
    // 属性的 读写性 语义性 原子性
    // 语义性
    // assign 弱引用 非对象
    // retain 强引用  修饰 对象
    // 原子性
    // 原子性 做了多线程处理,保证访问安全,但是慢
    // 非原子性
    // 手机一般用这个
    // 读写性
    // ......


    return 0;
}
